home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CD ROM Paradise Collection 4
/
CD ROM Paradise Collection 4 1995 Nov.iso
/
program
/
swagg_m.zip
/
INTERRUP.SWG
/
0002_CLOCK1.PAS.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-05-28
|
3KB
|
92 lines
{
CARLOS BEGUIGNE
}
Program ClockOnScreen;
{$R-,V-,S-,M 1024, 0, 0
ClockOnScreen - Installs resident clock on upper right corner of screen.
{$IFOPT S+ }
{
You must disable stack checking here, since a Runtime error 202 will
be generated whenever the stack Pointer (as returned by SPtr) is likely
to drop below 1024.
}
Uses
Dos, Crt;
Const
Offset = $8E; { Line 1, Column $8E/2 = 71 }
TimerTick = $1C; { Timer interrupt }
black = 0;
gray = 7;
EnvSeg = $002C; { Segment of Dos environment }
ColourSeg = $B800; { Segment of colour video RAM }
MonoSeg = $B000; { Segment of monochrome ideo RAM }
CrtSegment : Word = ColourSeg;
Type
ScreenArray = Array[0..7] of Record
number, attribute : Char;
end;
ScreenPtr = ScreenArray;
Var
VideoMode : Byte Absolute $0000:$0449;
Screen : ^ScreenPtr; { Physical screen address }
ClockColour : Char;
Int1CSave : Procedure;
Procedure ShowTime; Interrupt;
Const
separator = ':';
Var
ThisMode : Byte;
Time : LongInt;
i : Integer;
BIOSTicker : LongInt Absolute $0000:$046C;
Procedure DisplayDigit(offset : Integer; digit : Integer);
begin
Screen^ [offset].number := Chr(digit div 10+Ord('0'));
Screen^ [offset+1].number := Chr(digit mod 10+Ord('0'));
end; { DisplayDigit }
begin
ThisMode := VideoMode;
if not ((ThisMode = 2) or (ThisMode = 3) or (ThisMode = 7)) Then
Exit; { Do not popup in a Graphic mode }
For i := 0 to 7 Do
Screen^[i].attribute := ClockColour;
Time := (1365*BIOSTicker) div 24852;
DisplayDigit(0, Time div 3600); { hours }
Screen^[2].number := separator;
Time := Time mod 3600;
DisplayDigit(3, Time div 60); { minutes }
Screen^[5].number := separator;
DisplayDigit(6, Time mod 60); { seconds }
Inline($9C); { PUSHF }
Int1CSave;
end; { ShowTime }
Procedure Release(segment : Word);
InLine(
$07/ { POP ES ; get segment of block to release }
$B4/$49/ { MOV AH, 49h ; Free Allocated Memory }
$CD/$21); { INT 21h ; call Dos }
begin { ClockOnScreen }
if VideoMode = 7 Then
CrtSegment := MonoSeg;
ClockColour := Chr(gray*16+black); {display video attribute }
Screen := Ptr(CrtSegment, Offset);
GetIntVec(TimerTick, @Int1CSave);
SetIntVec(TimerTick, @ShowTime);
Release(MemW[PrefixSeg:EnvSeg]); {Release the environment }
Keep(0);
readln;
end. { ClockOnScreen }